home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 June / Chip_2002-06_cd1.bin / zkuste / delphi / kolekce / d6 / rxlibsetup.exe / {app} / units / RXPRGRSS.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-02-19  |  5.5 KB  |  209 lines

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 2001,2002 SGB Software          }
  6. {         Copyright (c) 1997, 1998 Fedor Koshevnikov,   }
  7. {                        Igor Pavluk and Serge Korolev  }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11.  
  12. unit RxPrgrss;
  13.  
  14. interface
  15.  
  16. {$I RX.INC}
  17.  
  18. uses SysUtils, Classes, Controls;
  19.  
  20. procedure RegisterProgressControl(AClass: TControlClass; const MaxPropName,
  21.   MinPropName, ProgressPropName: string);
  22. procedure UnRegisterProgressControl(AClass: TControlClass);
  23. function SupportsProgressControl(Control: TControl): Boolean;
  24.  
  25. procedure SetProgressMax(Control: TControl; MaxValue: Longint);
  26. procedure SetProgressMin(Control: TControl; MinValue: Longint);
  27. procedure SetProgressValue(Control: TControl; ProgressValue: Longint);
  28.  
  29. implementation
  30.  
  31. {$DEFINE USE_GAUGE}
  32. {$IFDEF WIN32}
  33.   {$IFDEF USE_PROGRESSBAR}
  34.     {$UNDEF USE_GAUGE}
  35.   {$ENDIF}
  36. {$ENDIF}
  37.  
  38. uses TypInfo, {$IFDEF WIN32} {$IFDEF USE_GAUGE} Gauges, {$ENDIF} ComCtrls;
  39.   {$ELSE} Gauges; {$ENDIF}
  40.  
  41. { TProgressList }
  42.  
  43. type
  44.   TProgressProp = (ppMax, ppMin, ppProgress);
  45.  
  46.   PProgressData = ^TProgressData;
  47.   TProgressData = record
  48.     ControlClass: TControlClass;
  49.     MaxProperty: string[63];
  50.     MinProperty: string[63];
  51.     ProgressProperty: string[63];
  52.   end;
  53.  
  54.   TProgressList = class(TList)
  55.   public
  56.     constructor Create;
  57.     destructor Destroy; override;
  58.     procedure Add(AClass: TControlClass; const MaxPropName, MinPropName,
  59.       ProgressPropName: string);
  60.     function FindClass(AClass: TControlClass): Integer;
  61.     procedure Remove(AClass: TControlClass);
  62.     function SetControlProperty(Control: TControl; Prop: TProgressProp;
  63.       Value: Longint): Boolean;
  64.   end;
  65.  
  66. constructor TProgressList.Create;
  67. begin
  68.   inherited Create;
  69. {$IFDEF WIN32}
  70.   Add(TProgressBar, 'Max', 'Min', 'Position');
  71. {$ENDIF}
  72. {$IFDEF USE_GAUGE}
  73.   Add(TGauge, 'MaxValue', 'MinValue', 'Progress');
  74. {$ENDIF}
  75. end;
  76.  
  77. destructor TProgressList.Destroy;
  78. var
  79.   I: Integer;
  80. begin
  81.   for I := 0 to Count - 1 do Dispose(PProgressData(Items[I]));
  82.   inherited Destroy;
  83. end;
  84.  
  85. procedure TProgressList.Add(AClass: TControlClass; const MaxPropName,
  86.   MinPropName, ProgressPropName: string);
  87. var
  88.   NewRec: PProgressData;
  89. begin
  90.   New(NewRec);
  91.   with NewRec^ do begin
  92.     ControlClass := AClass;
  93.     MaxProperty := MaxPropName;
  94.     MinProperty := MinPropName;
  95.     ProgressProperty := ProgressPropName;
  96.   end;
  97.   inherited Add(NewRec);
  98. end;
  99.  
  100. function TProgressList.FindClass(AClass: TControlClass): Integer;
  101. var
  102.   P: PProgressData;
  103. begin
  104.   for Result := Count - 1 downto 0 do begin
  105.     P := PProgressData(Items[Result]);
  106.     if AClass.InheritsFrom(P^.ControlClass) then Exit;
  107.   end;
  108.   Result := -1;
  109. end;
  110.  
  111. procedure TProgressList.Remove(AClass: TControlClass);
  112. var
  113.   I: Integer;
  114.   P: PProgressData;
  115. begin
  116.   for I := Count - 1 downto 0 do begin
  117.     P := PProgressData(Items[I]);
  118.     if P^.ControlClass.InheritsFrom(AClass) then begin
  119.       Dispose(P);
  120.       Delete(I);
  121.     end;
  122.   end;
  123. end;
  124.  
  125. function TProgressList.SetControlProperty(Control: TControl;
  126.   Prop: TProgressProp; Value: Longint): Boolean;
  127. var
  128.   PropInfo: PPropInfo;
  129.   I: Integer;
  130.   PropName: string;
  131. begin
  132.   Result := False;
  133.   if (Control <> nil) then begin
  134.     I := FindClass(TControlClass(Control.ClassType));
  135.     if I >= 0 then begin
  136.       case Prop of
  137.         ppMax: PropName := PProgressData(Items[I])^.MaxProperty;
  138.         ppMin: PropName := PProgressData(Items[I])^.MinProperty;
  139.         else {ppProgress}
  140.           PropName := PProgressData(Items[I])^.ProgressProperty;
  141.       end;
  142.       PropInfo := GetPropInfo(Control.ClassInfo, PropName);
  143.       if (PropInfo <> nil) and (PropInfo^.PropType^.Kind in
  144.         [tkInteger, tkFloat {$IFDEF WIN32}, tkVariant {$ENDIF}]) then
  145.       begin
  146.         SetOrdProp(Control, PropInfo, Value);
  147.         Result := True;
  148.       end;
  149.     end;
  150.   end;
  151. end;
  152.  
  153. const
  154.   ProgressList: TProgressList = nil;
  155.  
  156. function GetProgressList: TProgressList;
  157. begin
  158.   if ProgressList = nil then ProgressList := TProgressList.Create;
  159.   Result := ProgressList;
  160. end;
  161.  
  162. function SupportsProgressControl(Control: TControl): Boolean;
  163. begin
  164.   if Control <> nil then
  165.     Result := GetProgressList.FindClass(TControlClass(Control.ClassType)) >= 0
  166.   else Result := False;
  167. end;
  168.  
  169. procedure RegisterProgressControl(AClass: TControlClass; const MaxPropName,
  170.   MinPropName, ProgressPropName: string);
  171. begin
  172.   GetProgressList.Add(AClass, MaxPropName, MinPropName, ProgressPropName);
  173. end;
  174.  
  175. procedure UnRegisterProgressControl(AClass: TControlClass);
  176. begin
  177.   if ProgressList <> nil then ProgressList.Remove(AClass);
  178. end;
  179.  
  180. procedure SetProgressMax(Control: TControl; MaxValue: Longint);
  181. begin
  182.   GetProgressList.SetControlProperty(Control, ppMax, MaxValue);
  183. end;
  184.  
  185. procedure SetProgressMin(Control: TControl; MinValue: Longint);
  186. begin
  187.   GetProgressList.SetControlProperty(Control, ppMin, MinValue);
  188. end;
  189.  
  190. procedure SetProgressValue(Control: TControl; ProgressValue: Longint);
  191. begin
  192.   GetProgressList.SetControlProperty(Control, ppProgress, ProgressValue);
  193. end;
  194.  
  195. {$IFNDEF WIN32}
  196. procedure Finalize; far;
  197. begin
  198.   ProgressList.Free;
  199. end;
  200. {$ENDIF}
  201.  
  202. initialization
  203. {$IFDEF WIN32}
  204. finalization
  205.   ProgressList.Free;
  206. {$ELSE}
  207.   AddExitProc(Finalize);
  208. {$ENDIF}
  209. end.